25  印度对外贸易的探索性研究

25.1 引言贸易数据分析的重要性

对外贸易分析:

  • 贸易伙伴: 识别主要进出口国
  • 贸易趋势: 了解贸易发展方向
  • 政策制定: 基于数据的贸易政策

25.2 本章学习目标

本章以印度2010—2018年进出口贸易数据为例,练习长表面板数据的重塑与多国趋势对比。通过本章学习,你将掌握:

  1. 长表面板数据(国家-年份-贸易额)的读取与结构检查
  2. pd.pivot_table 把长表转成”国家×年份”宽表,便于按国家取行绘图
  3. .loc 按国家标签提取单行时间序列并绘制趋势折线
  4. subplot(221)~subplot(224) 组织2×2子图,对比多个贸易伙伴
  5. 从进出口双向趋势中区分”稳步增长型”与”波动型”伙伴

先修内容:第 章节 13 章(分组聚合与透视)与第 章节 18 章(子图与折线图基础)。

25.3 数据准备

列表 25.1: 印度进出口贸易数据读取与透视表构建
# 注:sk2018-2010_export.csv 和 sk2018-2010_import.csv 数据文件本地没有,但平台已经内置
# =============================================================================
# 题目:印度对外贸易数据读取与透视表构建
# =============================================================================
# 本代码块实现印度进出口贸易数据的读取和初步整理
# 通过透视表构建,将数据按国家和年份进行重排,便于后续趋势分析

# ==================== 导入数据分析与可视化库 ====================
import pandas as pd  # 导入Pandas库,用于数据表操作和分析
import numpy as np  # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt  # 导入Matplotlib库,用于绘图
from IPython.display import display, Markdown  # 导入显示工具,用于富文本输出

# ==================== 设置中文字体支持 ====================
plt.rcParams['font.sans-serif'] = ['Source Han Serif SC', 'SimHei']  # 规范字体在前,SimHei 仅作后备  # 设置绘图时的中文字体为黑体,避免中文显示为方框
plt.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题

# ==================== 读取进出口贸易数据 ====================
df_export = pd.read_csv('sk2018-2010_export.csv')  # 读取2010-2018年印度出口数据,包含国家、年份、贸易额等字段
df_import = pd.read_csv('sk2018-2010_import.csv')  # 读取2010-2018年印度进口数据,包含国家、年份、贸易额等字段

print('出口数据形状:', df_export.shape)  # 输出出口数据集的行数和列数,了解数据规模
print('进口数据形状:', df_import.shape)  # 输出进口数据集的行数和列数,了解数据规模

# ==================== 构建出口透视表 ====================
exp_country_table = pd.pivot_table(
    df_export,  # 以出口数据为源数据
    values='value',  # 透视表的值为贸易额(value字段)
    index='country',  # 行索引为国家,便于观察各国家趋势
    columns='year'  # 列为年份,便于观察时间序列变化
)

# ==================== 构建进口透视表 ====================
imp_country_table = pd.pivot_table(
    df_import,  # 以进口数据为源数据
    values='value',  # 透视表的值为贸易额(value字段)
    index='country',  # 行索引为国家
    columns='year'  # 列为年份
)

print('\n出口透视表:')  # 输出标题
print(exp_country_table.head())  # 显示出口透视表的前5行,预览数据结构

25.4 出口趋势分析

文件名提示:平台题面中的文件名 sk2018-2010_export.csvsk2018-2010_import.csv 疑为 sk2010-2018_export.csv / sk2010-2018_import.csv 之误写——数据实际覆盖2010—2018年(见块内图题的年份区间),本章前后两个代码块均沿用题面文件名,请以平台题面与平台内置文件的实际命名为准。

任务要求:读取平台内置的印度进出口数据,构建”国家×年份”透视表;定义 bold 函数以Markdown加粗输出小节标题;在2×2子图中分别绘制对美国、阿联酋、中国、香港的出口趋势(紫色线),以及从美国、阿联酋、中国、沙特阿拉伯的进口趋势(珊瑚色线),并将两幅图分别保存为图形文件。

列表 25.2: 平台原始代码
# 注:sk2018-2010_export.csv 和 sk2018-2010_import.csv 数据文件本地没有,但平台已经内置
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import pandas as pd  # 导入Pandas数据分析库
import numpy as np  # 导入NumPy数值计算库
import matplotlib.pyplot as plt  # 导入Matplotlib绘图库
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体作为默认字体以支持中文
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号
from IPython.display import display, Markdown  # 导入display,模块

#定义加粗显示函数
def bold(string):
  display(Markdown(string))  # 以Markdown格式渲染输出描述性文本
   
#读取进出口数据
df_export = pd.read_csv('sk2018-2010_export.csv')
df_import = pd.read_csv('sk2018-2010_import.csv')  # 从CSV文件读取数据存入df_import
# 创建透视表exp_country_table
exp_country_table = pd.pivot_table(df_export, values = 'value', index = 'country', columns = 'year')
# 创建透视表imp_country_table
imp_country_table = pd.pivot_table(df_import, values = 'value', index = 'country', columns = 'year')

bold('**2010年至2018年印度对外贸易出口方向的趋势**')  # 以粗体Markdown格式输出:2010年至2018年印度对外贸易出口方向的趋势
plt.figure(figsize=(15,10))  # 创建图形画布
 
plt.subplot(221)  # 选择子图位置
g = exp_country_table.loc["U S A"].plot(color='purple', linewidth=3)  # 按标签索引提取数据
g.set_ylabel('USD (millions)', fontsize = 12)  # 设置Y轴标签
g.set_xlabel('Year', fontsize = 12)  # 设置X轴标签
g.set_title('对美国出口的趋势', size = 15)  # 设置图表标题

plt.subplot(222)  # 选择子图位置
g1 = exp_country_table.loc["U ARAB EMTS"].plot(color='purple', linewidth=3)  # 按标签索引提取数据
g1.set_ylabel('USD (millions)', fontsize = 12)  # 设置Y轴标签
g1.set_xlabel('Year', fontsize = 12)  # 设置X轴标签
g1.set_title('对阿联酋出口的趋势', size = 15)  # 设置图表标题

plt.subplot(223)  # 选择子图位置
g2 = exp_country_table.loc["CHINA P RP"].plot(color='purple', linewidth=3)  # 按标签索引提取数据
g2.set_ylabel('USD (millions)', fontsize = 12)  # 设置Y轴标签
g2.set_xlabel('Year', fontsize = 12)  # 设置X轴标签
g2.set_title('对中国出口的趋势', size = 15)  # 设置图表标题

plt.subplot(224)  # 选择子图位置
g3 = exp_country_table.loc["HONG KONG"].plot(color='purple', linewidth=3)  # 按标签索引提取数据
g3.set_ylabel('USD (millions)', fontsize = 12)  # 设置Y轴标签
g3.set_xlabel('Year', fontsize = 12)  # 设置X轴标签
g3.set_title('对香港出口的趋势', size = 15)  # 设置图表标题

plt.subplots_adjust(hspace = 0.4)  # 调整子图间距
plt.savefig("5.png")  # 保存图形至文件

bold('**2010年至2018年印度对外贸易进口方向的趋势**')  # 以粗体Markdown格式输出:2010年至2018年印度对外贸易进口方向的趋势
plt.figure(figsize=(15,10))  # 创建图形画布
 
plt.subplot(221)  # 选择子图位置
g = imp_country_table.loc["U S A"].plot(color='coral', linewidth=3)  # 按标签索引提取数据
g.set_ylabel('USD (millions)', fontsize = 12)  # 设置Y轴标签
g.set_xlabel('Year', fontsize = 12)  # 设置X轴标签
g.set_title('从美国进口的趋势', size = 15)  # 设置图表标题

plt.subplot(222)  # 选择子图位置
g1 = imp_country_table.loc["U ARAB EMTS"].plot(color='coral', linewidth=3)  # 按标签索引提取数据
g1.set_ylabel('USD (millions)', fontsize = 12)  # 设置Y轴标签
g1.set_xlabel('Year', fontsize = 12)  # 设置X轴标签
g1.set_title('从阿联酋进口的趋势', size = 15)  # 设置图表标题

plt.subplot(223)  # 选择子图位置
g2 = imp_country_table.loc["CHINA P RP"].plot(color='coral', linewidth=3)  # 按标签索引提取数据
g2.set_ylabel('USD (millions)', fontsize = 12)  # 设置Y轴标签
g2.set_xlabel('Year', fontsize = 12)  # 设置X轴标签
g2.set_title('从中国进口的趋势', size = 15)  # 设置图表标题

plt.subplot(224)  # 选择子图位置
g3 = imp_country_table.loc["SAUDI ARAB"].plot(color='coral', linewidth=3)  # 按标签索引提取数据
g3.set_ylabel('USD (millions)', fontsize = 12)  # 设置Y轴标签
g3.set_xlabel('Year', fontsize = 12)  # 设置X轴标签
g3.set_title('从沙特阿拉伯进口的趋势', size = 15)  # 设置图表标题

plt.subplots_adjust(hspace = 0.4)  # 调整子图间距
plt.savefig("6.png")  # 保存图形至文件

预期输出:数据文件平台内置,本地无数据,具体数值以平台运行结果为准。判读要点:

  1. 文本输出:加粗的Markdown小节标题,以及(前一块)数据形状与出口透视表前几行——确认宽表的行是国家、列是年份。
  2. 图形输出(5.png、6.png):出口、进口各一幅2×2子图,纵轴单位为百万美元。判读要点:每条曲线的总体方向(稳步上行、震荡、回落)与拐点年份;同一伙伴(如美国、中国)在出口图与进口图中的趋势对照。
  3. 图题与轴标签为英文,属于平台原始代码原样内容;读图时以曲线形态为主,不依赖标题语言。

25.5 进口趋势分析

列表 25.3
# 注:该代码块依赖的数据来自上方平台任务代码块,本块承接上方平台任务的代码与数据(变量沿用平台任务)
bold('**2010年至2018年印度对外贸易进口方向的趋势**')  # 显示章节标题

# ==================== 创建2x2子图布局 ====================
fig, axes = plt.subplots(2, 2, figsize=(15, 10))  # 创建4个子图,用于展示4个主要进口来源国的趋势

# ==================== 绘制从美国进口趋势图 ====================
imp_country_table.loc['U S A'].plot(  # 选择从美国进口的数据
    ax=axes[0, 0],  # 绘制在第一行第一列
    color='coral',  # 设置线条颜色为珊瑚色,与出口的紫色形成对比
    linewidth=3  # 设置线宽
)
axes[0, 0].set_ylabel('USD (millions)', fontsize=12)  # 设置y轴标签
axes[0, 0].set_xlabel('Year', fontsize=12)  # 设置x轴标签
axes[0, 0].set_title('从美国进口的趋势', size=15)  # 设置子图标题

# ==================== 绘制从阿联酋进口趋势图 ====================
imp_country_table.loc['U ARAB EMTS'].plot(  # 选择从阿联酋进口的数据
    ax=axes[0, 1],  # 绘制在第一行第二列
    color='coral',  # 使用珊瑚色,保持一致性
    linewidth=3  # 设置线宽
)
axes[0, 1].set_ylabel('USD (millions)', fontsize=12)  # 设置y轴标签
axes[0, 1].set_xlabel('Year', fontsize=12)  # 设置x轴标签
axes[0, 1].set_title('从阿联酋进口的趋势', size=15)  # 设置子图标题

# ==================== 绘制从中国进口趋势图 ====================
imp_country_table.loc['CHINA P RP'].plot(  # 选择从中国进口的数据
    ax=axes[1, 0],  # 绘制在第二行第一列
    color='coral',  # 使用珊瑚色
    linewidth=3  # 设置线宽
)
axes[1, 0].set_ylabel('USD (millions)', fontsize=12)  # 设置y轴标签
axes[1, 0].set_xlabel('Year', fontsize=12)  # 设置x轴标签
axes[1, 0].set_title('从中国进口的趋势', size=15)  # 设置子图标题

# ==================== 绘制从沙特阿拉伯进口趋势图 ====================
imp_country_table.loc['SAUDI ARAB'].plot(  # 选择从沙特阿拉伯进口的数据
    ax=axes[1, 1],  # 绘制在第二行第二列
    color='coral',  # 使用珊瑚色
    linewidth=3  # 设置线宽
)
axes[1, 1].set_ylabel('USD (millions)', fontsize=12)  # 设置y轴标签
axes[1, 1].set_xlabel('Year', fontsize=12)  # 设置x轴标签
axes[1, 1].set_title('从沙特阿拉伯进口的趋势', size=15)  # 设置子图标题

# ==================== 调整子图间距并显示 ====================
plt.subplots_adjust(hspace=0.4)  # 设置子图垂直间距
plt.tight_layout()  # 自动调整布局
plt.show()  # 显示图形

25.6 分析结论

出口趋势:

  • 对美国、中国出口稳步增长
  • 阿联酋和香港有所波动

进口趋势:

  • 从中国进口持续增长
  • 能源进口(阿联酋、沙特)受油价影响

25.7 本章小结

本章新增的技能要点:

  1. 长表转宽表是趋势分析的前置:pd.pivot_table(values='value', index='country', columns='year') 一行完成”国家×年份”重排。
  2. 画单个国家趋势 = 宽表按行取数:exp_country_table.loc['U S A'] 取出一行年份序列后直接交给 plot
  3. 多子图布局:subplot(22x) 的位置编号,配合 subplots_adjust(hspace=...) 控制纵向间距;新一代写法 fig, axes = plt.subplots(2, 2) 与之等价。
  4. 双色编码区分口径:出口用紫色、进口用珊瑚色,同一伙伴在两幅图中并列对照,避免孤立解读单边数据。
  5. 题面细节存疑时的诚实处理:文件名疑为笔误时保留原样并加注说明,以平台题面为准。

易错点:

  • pd.pivot_table 默认 aggfunc='mean':要总和必须显式写 aggfunc='sum';同一”国家×年份”存在重复记录时,默认取均值而非求和
  • .loc['USA'].loc['中国'] 这类写法会抛 KeyError:行标签必须与平台数据逐字符一致,如 U S ACHINA P RPU ARAB EMTS
  • 自行把文件名”纠正”为 sk2010-2018_export.csv:平台按题面原文件名内置文件,疑为笔误也应原样沿用,以平台题面与内置文件实际命名为准
  • 增长榜只报倍数不报期末值:小基数国家容易翻出高倍数;某国期初或期末缺失时相除得 NaN 且被排到表尾,下结论前先确认数据完整性
  • 只看出口或只看进口单边曲线就下结论:金额上行可能是价格(油价)效应而非需求扩张,应双边对照并分清金额与数量口径
  • subplot(221) 的三位编号是”行数-列数-序号”,序号从1起按行排布;误当坐标或从0数起会把子图画错位置

25.8 动手与思考

以下练习每题附参考答案(默认折叠);概念题与变式题可对照自查,商业判断题不设唯一答案,判断依据与口径比结论更重要。

  1. 概念辨析:pd.pivot_tablegroupby+unstack 都能完成”国家×年份”重排,两者在聚合函数与缺失值处理上的默认行为有何不同?对本章数据可能造成什么差别?

    参考答案(点开前请先独立完成)

    解题思路:聚合函数上,pd.pivot_table 的默认 aggfunc='mean'(要求总和必须显式写 aggfunc='sum'),而 groupby 没有默认聚合、必须显式接 .sum().mean(),聚合方式始终写在明面上。缺失值处理上:某个“国家×年份”组合在源表缺失时,两者都在对应位置给出缺失值(pivot_tablefill_value 默认不做填充);但 pivot_table 默认 dropna=True,会把整年全缺失的列整列丢弃,unstack() 则保留全部组合、缺失处留空;此外若用 groupby().sum(),整组值都缺失时求和结果是 0 而非缺失值(求和会跳过缺失),这与 pivot_table 的表现又不相同。对本章数据的影响:平台数据中每个“国家×年份”组合只出现一次时,单条记录的均值就是它本身,meansum 等价,两种写法结果一致;一旦源表存在同一国家同一年的重复记录或缺失组合,差异立刻显现——在6行迷你长表上实测,重复组合 pivot_table 默认取均值15、groupby().sum() 得30,而全缺失的年份列一个被丢弃、一个保留为空列。因此读别人的宽表时,先确认它是怎么聚合、怎么处理缺失的。

    回扣本章:对应“本章新增的技能要点”第1条(长表转宽表是趋势分析的前置,转换的默认行为要先弄清)。

  2. 概念辨析:折线图上”稳步增长”与”波动上行”的判别标准是什么?为什么贸易趋势分析应同时看进出口两端?

    参考答案(点开前请先独立完成)

    解题思路:判别标准看局部回撤与斜率稳定性。“稳步增长”表现为逐期上行、即使回落也幅度小、时间短,各点围绕一条上行直线的离散度小;“波动上行”表现为趋势方向向上但存在明显的深回撤或大起大落,逐年变化率的幅度大。需要量化时,可用逐年变化率的标准差(波动性)对照趋势斜率(方向)来表述。同时看进出口两端的原因有三:其一,单边曲线分不清“对该伙伴的贸易量真在扩张”与“只是价格(如油价)在抬升金额”;其二,同一伙伴在出口图与进口图中的形态可能相反——例如对某伙伴出口稳步增长、从其进口却随商品价格大起大落,只看一边会把价格效应误读成需求变化;其三,进出口合起来才构成双边贸易关系的完整口径,顺差逆差的方向决定了贸易议价与政策风险。

    回扣本章:对应“本章新增的技能要点”第4条(双色编码区分口径、同一伙伴在两幅图中并列对照,避免孤立解读单边数据)。

  3. 变式任务:把子图中的贸易伙伴换成另外两个国家,改造思路是什么?你会依据什么标准挑选国家(贸易规模、增速还是波动性)?

    参考答案(点开前请先独立完成)

    改造思路:先定标准、再换标签。挑选标准可以量化为三个榜单:按九年贸易总额排“规模榜”(exp_country_table.sum(axis=1))、按期末与期初之比排“增速榜”(exp_country_table[2018] / exp_country_table[2010])、按逐年变化率的标准差排“波动榜”(pct_change(axis=1).std(axis=1))——三个标准挑出的国家通常不同,选哪个取决于分析目的(研究主力伙伴看规模榜、寻找新兴市场看增速榜、研究风险看波动榜)。代码上只动每幅子图里的 .loc['…'] 国家标签与 set_title 的国名,其余行不变;国家标签要按平台数据的实际写法填写(如 “U S A”、“CHINA P RP”)。

    # 变式代码:先排三个选国榜单,再替换子图标签(其余行与@lst-ch25-platform-task一致)
    volume_rank = exp_country_table.sum(axis=1).sort_values(ascending=False)  # ← 新增:标准一,九年出口总额排“规模榜”
    growth_rank = (exp_country_table[2018] / exp_country_table[2010]).sort_values(ascending=False)  # ← 新增:标准二,期末/期初排“增速榜”
    volatility_rank = exp_country_table.pct_change(axis=1).std(axis=1).sort_values(ascending=False)  # ← 新增:标准三,逐年变化率标准差排“波动榜”
    print(volume_rank.head())  # ← 新增:先看榜单,再决定替换哪两个国家
    plt.figure(figsize=(15, 10))  # 与平台任务一致
    plt.subplot(221)  # 与平台任务一致
    g0 = exp_country_table.loc['榜单选出的国家一'].plot(color='purple', linewidth=3)  # ← 改动点1:.loc标签换成榜单选出的国家
    g0.set_title('对某国出口的趋势', size=15)  # ← 改动点2:标题同步换成该国国名
    plt.subplot(222)  # 与平台任务一致
    g1 = exp_country_table.loc['榜单选出的国家二'].plot(color='purple', linewidth=3)  # ← 改动点1:同上
    g1.set_title('对某国出口的趋势', size=15)  # ← 改动点2:同上

    结构性判读:2×2子图布局、紫色折线与纵轴单位都不变,变的只是曲线本身。判读要点:规模榜国家的曲线纵轴量级高、走势通常较稳;增速榜国家可能起点低但斜率陡;波动榜国家曲线锯齿明显。换国后先看纵轴刻度再比较形态,避免把“量级差异”误读成“增长快慢”。

    本地演练版(模拟数据):在5国×9年的合成长表上实跑三种选国标准:

    # 本地演练版:三种选国标准(规模、增速、波动性)各自挑出的国家不同
    import pandas as pd  # 导入Pandas数据分析库
    years = list(range(2010, 2019))  # 2010—2018年,同平台数据区间
    trade = pd.DataFrame({  # 5国×9年合成长表:甲国大体量稳增、乙国小体量高增、丙国大幅波动、丁国平稳、戊国温和增长
        'country': ['甲国'] * 9 + ['乙国'] * 9 + ['丙国'] * 9 + ['丁国'] * 9 + ['戊国'] * 9,  # 国家列
        'year': years * 5,  # 年份列
        'value': [20000 + 800 * t for t in range(9)] + [500 + 350 * t for t in range(9)]
                 + [9000, 4000, 13000, 3000, 11000, 5000, 14000, 6000, 12000]
                 + [6000 + 60 * t for t in range(9)] + [3000 + 420 * t for t in range(9)]  # 各国数值路径
    })
    wide = pd.pivot_table(trade, values='value', index='country', columns='year')  # 与平台任务同型的国家×年份宽表
    volume_rank = wide.sum(axis=1).sort_values(ascending=False)  # 规模标准:九年贸易总额
    growth_rank = (wide[2018] / wide[2010]).sort_values(ascending=False)  # 增速标准:2018年是2010年的倍数
    volatility_rank = wide.pct_change(axis=1).std(axis=1).sort_values(ascending=False)  # 波动标准:逐年变化率的标准差
    print('规模榜(九年总额)前两名:', volume_rank.index[:2].tolist())  # 依规模选国时会挑中的两个
    print('增速榜(2018/2010倍数)前两名:', growth_rank.index[:2].tolist())  # 依增速选国时会挑中的两个
    print('波动榜(逐年变化率标准差)前两名:', volatility_rank.index[:2].tolist())  # 依波动性选国时会挑中的两个
    print(pd.DataFrame({'规模榜': volume_rank, '增长倍数': growth_rank}))  # 三种标准并排对照

    模拟数据演练结果(本机 peter 环境实际运行结果,仅演示流程与判读方法,真实数值以平台运行结果为准):

    规模榜(九年总额)前两名: ['甲国', '丙国']
    增速榜(2018/2010倍数)前两名: ['乙国', '戊国']
    波动榜(逐年变化率标准差)前两名: ['丙国', '乙国']
                   规模榜      增长倍数
    country
    丁国        56160.0  1.080000
    丙国        77000.0  1.333333
    乙国        17100.0  6.600000
    戊国        42120.0  2.120000
    甲国       208800.0  1.320000

    演练判读:规模榜与增速榜挑出的国家完全不同(甲国、丙国 对 乙国、戊国)——先明确分析目的,再决定用哪个榜单选国,这一步应写在报告里而不是事后补。

    预期输出:数据文件由教学平台内置,本机无法复现,具体数值以平台运行结果为准。

    注意:以上为本题变式的独立代码;列表 25.2 对应平台任务的原始代码块仍须原样输入教学平台,不要用本变式替换。

    回扣本章:对应“本章新增的技能要点”第2条(画单个国家趋势就是宽表按行取数,换国只是换 .loc 的行标签)。

  4. 变式任务:在透视表基础上计算2010→2018年的增长倍数并降序排序,得到”增长最快伙伴榜”——需要增加哪些步骤?

    参考答案(点开前请先独立完成)

    改造思路:在透视表之后增加三步:第一步,取宽表的2018列除以2010列得到“增长倍数”;第二步,按增长倍数降序排序;第三步,把期末值并排列出——只看倍数容易被“小基数高倍数”误导,期末值能标出体量。

    # 变式代码:在透视表上增加“增长最快伙伴榜”三步
    growth = (exp_country_table[2018] / exp_country_table[2010]).rename('增长倍数')  # ← 新增步骤1:期末值除以期初值
    growth_board = growth.sort_values(ascending=False).to_frame()  # ← 新增步骤2:按增长倍数降序得到伙伴榜
    growth_board['期末值'] = exp_country_table[2018]  # ← 新增步骤3:并列出期末值,识别“小基数高倍数”
    print(growth_board.head())  # 输出榜单(进口方向对imp_country_table同样处理)

    结构性判读:输出是一张“国家×两列(增长倍数、期末值)”的排序表。判读要点:榜首未必是贸易体量最大的伙伴,小基数国家容易翻出高倍数,倍数与期末值要同时读;若某国在期初或期末年份缺失,相除会得到缺失值并被排序排到表尾,下结论前先确认数据完整性;出口与进口两张透视表应分别出榜,方向不能混。

    本地演练版(模拟数据):在与第3题同一份5国×9年合成数据上实跑:

    # 本地演练版:增长倍数榜单(数据与第3题演练一致)
    import pandas as pd  # 导入Pandas数据分析库
    years = list(range(2010, 2019))  # 2010—2018年,同平台数据区间
    trade = pd.DataFrame({  # 同第3题的5国×9年合成长表
        'country': ['甲国'] * 9 + ['乙国'] * 9 + ['丙国'] * 9 + ['丁国'] * 9 + ['戊国'] * 9,  # 国家列
        'year': years * 5,  # 年份列
        'value': [20000 + 800 * t for t in range(9)] + [500 + 350 * t for t in range(9)]
                 + [9000, 4000, 13000, 3000, 11000, 5000, 14000, 6000, 12000]
                 + [6000 + 60 * t for t in range(9)] + [3000 + 420 * t for t in range(9)]  # 各国数值路径
    })
    wide = pd.pivot_table(trade, values='value', index='country', columns='year')  # 与平台任务同型的国家×年份宽表
    growth = (wide[2018] / wide[2010]).rename('增长倍数')  # 新增步骤1:期末值除以期初值
    growth_board = growth.sort_values(ascending=False).to_frame()  # 新增步骤2:按增长倍数降序得到伙伴榜
    growth_board['期末值'] = wide[2018]  # 新增步骤3:并列出期末值,识别小基数高倍数
    print('2010→2018增长最快伙伴榜(模拟数据演练结果):')
    print(growth_board)  # 输出榜单

    模拟数据演练结果(本机 peter 环境实际运行结果,仅演示流程与判读方法,真实数值以平台运行结果为准):

    2010→2018增长最快伙伴榜(模拟数据演练结果):
             增长倍数      期末值
    country
    乙国       6.600000   3300.0
    戊国       2.120000   6360.0
    丙国       1.333333  12000.0
    甲国       1.320000  26400.0
    丁国       1.080000   6480.0

    演练判读:倍数榜首乙国(6.6倍)的期末值反而最低——高增速与小体量并存,如果只报倍数不报期末值,结论会被放大。

    预期输出:数据文件由教学平台内置,本机无法复现,具体数值以平台运行结果为准。

    注意:以上为本题变式的独立代码;列表 25.2 对应平台任务的原始代码块仍须原样输入教学平台,不要用本变式替换。

    回扣本章:对应“本章新增的技能要点”第1条(透视表把长表重排成“国家×年份”宽表之后,按列取数做除法即可派生新指标)。

  5. 商业判断:若平台结果显示从中国的进口持续增长、而从沙特与阿联酋的能源进口随油价明显波动(具体数值以平台运行结果为准),对依赖这两类进口原料的企业,采购与库存策略应如何设计?

    参考答案(点开前请先独立完成)

    参考作答框架:本题不设唯一结论,优秀作答应覆盖以下维度。

    • 口径先行:“随油价明显波动”按什么衡量(逐年变化率、滚动标准差,还是相对趋势线的离差);用金额还是数量口径——油价上涨会放大金额波动而数量未必变;数据以美元计价,汇率折算也会进入波动。金额口径的“波动”可能是价格现象而非供给现象。
    • 分析依据:两类原料的性质不同——稳定增长的进口(工业品、中间品)供给可靠、价格平稳,适合长期协议与低库存周转;随油价波动的能源类原料,价格与供给双重不确定,需要分摊风险而不是押注单边。
    • 策略框架:波动类原料可考虑多元供应来源、长约定价与现货组合、按价格区间分批补库(低价多囤、高价少囤但设上限)、用期货或长约锁价对冲,并把价格波动向下游售价传导的机制写进合同;稳定类原料以准时化补货与供应商协同为主,降低资金占用。
    • 风险考量:高位囤货面临跌价与资金占用风险,能源类还有仓储安全与保质期约束;长约锁定在价格暴跌时变成负担;过度依赖单一稳定来源同样有集中度风险。
    • 模型边界:平台数据止于2018年且为国家级贸易流,不含最新地缘政治、关税与航运冲击,也不等于企业自身的采购成本曲线;趋势外推只宜作基准情景。
    • 还需补充的数据:原料成本在总成本中的占比、库存持有成本与仓储能力、供应商交期与履约可靠性、可用的套保工具与基差、替代供应商与替代原料的可行性。
    • 常见错误作答形态:用单一国家的贸易趋势直接推出企业采购结论;只看金额不看数量;把“波动”一律当成风险而忽略低价窗口的采购机会。

    回扣本章:对应“本章新增的技能要点”第4条(同一伙伴在出口图与进口图中并列对照,贸易结论须双边、双口径同时看)。